#!/bin/sh
# name: deploy

usage()
{
    echo "用法: `basename $0` [选项]... [应用]...\n"
    echo "部署常用服务器应用, 支持局域网和广域网.\n"
    usage_options
    usage_applications
}

usage_options()
{
    echo "选项"
    echo "  -d, --domain        应用所使用的域名"
    echo "  -i, --ip=127.0.0.1  应用所使用的 IP 地址"
    echo "  -l, --lan           局域网部署, 需要在本地 (/etc/hosts) 配置域名"
    echo "  -w, --wan           广域网部署, 需要通过域名提供商配置 DNS"
    echo ""
}

usage_applications()
{
    echo "应用"
    echo "ftp       文件传输服务器"
    echo "mail      邮件服务器"
    echo "svn       代码管理服务器"
    echo "trac      TRAC 应用"
    echo "vpn       VPN 代理服务"
}

deploy_svn()
{
    echo " ========= 部署 SVN 服务器 ========="
    echo "安装依赖的软件包... "
    sudo apt-get install apache2 mysql-server subversion libapache2-svn \
        libapache2-mod-auth-mysql > /dev/null
    sudo a2enmod auth_mysql > /dev/null
    echo "安装依赖的软件包... done"
    APP_DIR=/srv/www/$APP_DOMAIN
    echo "创建项目 $APP_DIR... "
    if [ -d $APP_DIR ] ; then
        echo -n "目录 $APP_DIR 已存在, 是否直接覆盖? (yes/no) "
        read ANS
        case $ANS in
            yes)
                sudo rm -rf $APP_DIR ;;
            *)
                return 1 ;;
        esac
    fi
    if [ ! -d /srv/www/log ] ; then `sudo mkdir -p /srv/www/log` ; fi
    sudo mkdir -p $APP_DIR
    sudo svnadmin create --fs-type fsfs $APP_DIR
    sudo chown -R www-data $APP_DIR
    echo "创建项目 $APP_DIR... done"
    DB_NAME="`echo $APP_DOMAIN | sed 's/\./_/g'`_user"
    echo "创建用户验证数据库 $DB_NAME... "
    if create_db $DB_NAME ; then
        mysql -u $DB_USER -p$DB_PASSWD $DB_NAME -e \
            "USE $DB_NAME; \
            CREATE TABLE user (name char(30) NOT NULL COMMENT '用户名', \
            passwd char(32) NOT NULL COMMENT '密码',PRIMARY KEY (name) ) \
            ENGINE=InnoDB DEFAULT CHARSET=utf8; \
            INSERT INTO user VALUE ('guest', MD5('guest'))"
    else
        echo "[警告] 未覆盖原数据库 $DB_NAME, 可能导致无法正常访问"
    fi
    echo "配置虚拟主机..."
    if [ $APP_TYPE="lan" ] ; then
        echo -n "请将域名及 IP 添加到主机列表 (任意键开始编辑)... "
        read anykey
        add_host
    fi
    APP_SITE=/etc/apache2/sites-available/$APP_DOMAIN
    echo -n "配置 Apache 站点 $APP_SITE (任意键开始编辑)... "
    read anykey
    if [ -f $APP_SITE ] ; then
        echo -n "站点 $APP_SITE 已存在, 是否直接覆盖? (yes/no) "
        read ANS
        case $ANS in
            yes)
                sudo rm $APP_SITE ;;
            *)
                return 1 ;;
        esac
    fi
    add_svn_site
    sudo a2dissite $APP_DOMAIN > /dev/null
    sudo a2ensite $APP_DOMAIN > /dev/null
    sudo /etc/init.d/apache2 restart
    echo "SVN 服务器部署成功! 请使用用户 guest(guest) 访问: http://$APP_DOMAIN"
}

deploy_trac()
{
    return 0
}

add_host()
{
    if [ -z $EDITOR ] ; then EDITOR=vi ; fi
    sudo $EDITOR /etc/hosts
}

add_svn_site()
{
    if [ -f "$APP_TMPL_DIR/svn.tmpl" ] ; then
        sudo cp $APP_TMPL_DIR/svn.tmpl $APP_SITE
        sudo sed -i "s/\$APP_ADDR/$APP_ADDR/g" $APP_SITE
        sudo sed -i "s/\$APP_DOMAIN/$APP_DOMAIN/g" $APP_SITE
        RE_DIR=`echo $APP_DIR | sed -r 's:\/:\\\/:g'`
        sudo sed -i "s/\$APP_DIR/$RE_DIR/g" $APP_SITE
        sudo sed -i "s/\$DB_NAME/$DB_NAME/g" $APP_SITE
        sudo sed -i "s/\$DB_USER/$DB_USER/g" $APP_SITE
        sudo sed -i "s/\$DB_PASSWD/$DB_PASSWD/g" $APP_SITE
        sudo $EDITOR $APP_SITE
    else
        echo "[警告] 模板文件 $APP_TMPL_DIR/svn.tmpl 不存在, 需要自行配置站点 (任意键开始编辑)... "
        sudo $EDITOR $APP_SITE
    fi
}

# 参数: 数据库名称
create_db()
{
    echo -n "MySQL 用户名 (root): "
    read db_user
    if [ -z "$DB_USER" ] ; then DB_USER="root" ; fi
    echo -n "密码: "
    stty -echo
    read DB_PASSWD
    stty echo
    DB_NAME=$1
    echo ""
    echo "创建数据库 $DB_NAME... "
    EXIST_DB=`mysql -u $DB_USER -p$DB_PASSWD -e \
        "USE information_schema; \
        SELECT SCHEMA_NAME FROM SCHEMATA \
        WHERE SCHEMA_NAME = \"$DB_NAME\""`
    if [ -n "$EXIST_DB" ] ; then
        echo -n "数据库 $DB_NAME 已经存在, 是否删除后重新创建? (yes/no) "
        read ANS
        case $ANS in
            yes)
                mysql -u $DB_USER -p$DB_PASSWD -e "DROP DATABASE $DB_NAME" ;;
            *)
                return 1 ;;
        esac
    fi
    mysql -u $DB_USER -p$DB_PASSWD -e \
        "CREATE DATABASE $DB_NAME DEFAULT CHARSET utf8 COLLATE utf8_bin"
    echo "创建数据库 $DB_NAME... 完成"

    return 0
}

TEMP=`getopt -o :d:i:lw --long lan,wan,help -- "$@"`

if [ $? != 0 -o $# -lt 1 ] ; then
    echo "[警告] 参数不足"
    usage ; exit 1
fi

eval set -- "$TEMP"

APP_TYPE="lan"

if [ -L $0 ] ; then
    THIS_FILE=`readlink $0`
    THIS_DIR=`dirname $THIS_FILE`
elif [ -f $0 ] ; then
    cd `dirname $0`
    THIS_DIR=$PWD
else
    echo "[错误] 未知文件类型 $0"
    exit 1
fi

APP_TMPL_DIR="$THIS_DIR/tmpl"

while true ; do
    case "$1" in
        -d|--domain)
            APP_DOMAIN=$2 ; shift 2 ;;
        -i|--ip)
            APP_ADDR=$2 ; shift 2;;
        -l|--lan)
            shift ;;
        -w|--wan)
            APP_TYPE="wan" ; shift ;;
        --help)
            usage ; exit 0 ;;
        --)
            shift ; break ;;
        *)
            echo "[警告] 参数不合法"
            usage ; exit 1 ;;
    esac
done

# 如果为广域网部署, 必须指定域名, 如果为局域网部署, 必须指定域名及 IP.
case "$APP_TYPE" in
    lan)
        if [ -z "$APP_DOMAIN" -o -z "$APP_ADDR" ] ; then
            echo "[警告] 局域网部署需要指定应用的域名及 IP\n" >&2
            usage ; exit 1
        fi ;;
    wan)
        if [ -z "$APP_DOMAIN" ] ; then
            echo "[警告] 广域网部署需要指定应用域名\n" >&2
            usage ; exit 1
        fi ;;
esac

if [ -z "$1" ] ; then
    echo "[警告] 未指定待安装的应用"
    usage ; exit 1
fi

for arg do
    case "$arg" in
        ftp | mail | svn | trac) deploy_$arg ;;
    esac
done

